#!/usr/bin/env python
#coding: utf-8

import os
import datetime
from Download import request
from bs4 import BeautifulSoup
from pymongo import MongoClient

class mzitu():

    def __init__(self):
        client = MongoClient() # 与MongDB建立连接（这是默认连接本地MongDB数据库）
        db = client['meinvxiezhenji'] # 选择一个数据库
        self.meizitu_collection = db['meizitu'] # 在meizixiezhenji这个数据库中，选择一个集合
        self.title = '' # 用来保存页面主题
        self.url = '' # 用来保存页面地址
        self.img_urls = [] # 初始化一个列表,用来保存图片地址

    # 获取要爬取的信息
    def all_url(self, url):
        html = request.get(url, 3)
        all_a = BeautifulSoup(html.text, 'lxml').find('div', class_='all').find_all('a')
        for a in all_a:
            title = a.get_text()
            self.title = title # 将主题保存到self.title中
            print u'开始保存：', title
            # 避免路径中出现?号
            path = str(title.encode("utf-8")).replace("?", '_')
            self._mkdir(path)
            # 修改当前的工作目录
            os.chdir("C:\Users\Administrator\Desktop\mzitu\\"+path.decode("utf-8"))
            href = a['href'] # 获取url链接
            self.url = href # 将页面地址保存到self.url中
            if self.meizitu_collection.find_one({'主题页面': href}):  # 判断这个主题是否已经在数据库中、不在就运行else下的内容，在则忽略。
                print u'这个页面已经爬取过了'
            else:
                self._html(href)

    # 查找当前链接一共有多少图片
    def _html(self, href):
        html = request.get(href, 3)
        # 获取该链接总共有多少妹子图片，第十个 span 存储的就是所有的妹子图片
        max_span = BeautifulSoup(html.text, 'lxml').find_all('span')[10].get_text()
        page_num = 0  # 这个当作计数器用 （用来判断图片是否下载完毕）
        for page in range(1, int(max_span) + 1):
            page_num = page_num + 1 # 每for循环一次就+1  （当page_num等于max_span的时候，就证明我们的在下载最后一张图片了）
            page_url = href + '/' + str(page)
            self.img(page_url, max_span, page_num)  # 把上面我们我们需要的两个变量，传递给下一个函数。

    # 处理在上一步中每一个链接所表示的图片，如果是最后一张，则把相应的数据保存到数据库
    def img(self, page_url, max_span, page_num): # 添加上面传递的参数
        img_html = request.get(page_url, 3)
        # 获取当前链接中此人的所有的图片链接
        img_url = BeautifulSoup(img_html.text, 'lxml').find('div', class_='main-image').find('img')['src']
        self.img_urls.append(img_url) # 每一次 for page in range(1, int(max_span) + 1)获取到的图片地址都会添加到 img_urls这个初始化的列表
        # 当max_span和Page_num相等时，就是最后一张图片了，最后一次下载图片并保存到数据库中
        if int(max_span) == page_num:
            self.save(img_url)
            post = {  # 这是构造一个字典，里面有啥都是中文，很好理解吧！
                u'标题': self.title,
                u'主题页面': self.url,
                u'图片地址': self.img_urls,
                u'获取时间': datetime.datetime.now()
            }
            self.meizitu_collection.save(post) # 将post中的内容写入数据库
            print u'插入数据库成功'
        else:  # max_span 不等于 page_num 执行这下面
            self.save(img_url)

    # 保存图片
    def save(self, img_url):
        # 获取图片名称
        name = img_url[-9:-4]
        print u'开始保存：', img_url
        img = request.get(img_url, 3)
        f = open(name + '.jpg', 'ab')
        f.write(img.content)
        f.close()

    # 判断是否需要创建文件夹，如果存在的话不创建，不存在就创建
    def _mkdir(self, path):
        path = path.strip().decode("utf-8")
        isExists = os.path.exists(os.path.join("C:\Users\Administrator\Desktop\mzitu", path))
        if not isExists:
            print u'建了一个名字叫做<', path, u'>的文件夹！'
            os.makedirs(os.path.join("C:\Users\Administrator\Desktop\mzitu", path))
            return True
        else:
            print u'名字叫做<', path, u'>的文件夹已经存在了！'
            return False

# 实例化
Mzitu = mzitu() 
# 爬虫入口
Mzitu.all_url('http://www.mzitu.com/all')